package setting

import (
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

type Setting struct {
	vp *viper.Viper
}

// NewSetting 初始化本项目的基础属性
func NewSetting(configs ...string) (*Setting, error) {
	vp := viper.New()
	//设定配置文件的名称为 config
	vp.SetConfigName("config")
	for _, config := range configs {
		if config != "" {
			vp.AddConfigPath(config)
		}
	}
	//配置路径为相对路径 configs/
	vp.AddConfigPath("configs/")
	//配置类型为 yaml
	vp.SetConfigType("yaml")
	err := vp.ReadInConfig()
	if err != nil {
		return nil, err
	}

	s := &Setting{vp: vp}
	s.WatchSettingChange()
	return s, nil
}

func (s *Setting) WatchSettingChange() {
	//开启一个协程 goroutine
	go func() {
		//通过 WatchConfig 方法对文件配置进行监听
		s.vp.WatchConfig()
		//在 OnConfigChange 中调用刚刚编写的重载方法 ReloadAllSection 来处理热更新的文件监听事件回调
		//OnConfigChange 方法的回调方法形参，其实就是 fsnotify
		s.vp.OnConfigChange(func(in fsnotify.Event) {
			_ = s.ReloadAllSection()
		})
	}()
}
